/**
 * Copyright 2008-2009 HAN.BIFANG
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 *
 */
package han.bashe.business.ejb;

import han.bashe.business.pipeline.HandlerChain;
import han.bashe.business.pipeline.PipelineContext;
import han.bashe.common.exception.BasheErrorCode;
import han.bashe.common.exception.BasheException;
import han.bashe.common.message.NormalizedMessage;

import javax.annotation.Resource;
import javax.ejb.Remote;
import javax.ejb.SessionContext;
import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
 * @Author Kent
 */

@Stateless(mappedName = "PipelineSession", name = "Pipeline")
@Remote(Pipeline.class)
@TransactionAttribute(value = javax.ejb.TransactionAttributeType.REQUIRED)
public class PipelineSessionBean implements Pipeline {

	private static HandlerChain chain = new HandlerChain();
	@Resource
	private SessionContext ctx;

	public NormalizedMessage process(NormalizedMessage req)
			throws BasheException {
		try {
			PipelineContext con = new PipelineContext();
			con.setRequest(req);
			chain.handle(con);
			if(con.hasError()){
				throw con.getError();
			}
			return con.getResponse();
		} catch (Exception e) {
			ctx.setRollbackOnly();
			if(e instanceof BasheException)
				throw (BasheException)e;
			Log log = LogFactory.getLog(PipelineSessionBean.class);
			log.error("process() unknown error : ",e);
			throw new BasheException(BasheErrorCode.UNKNOWN_ERROR,"process() unknown error ",e);	
		}
		
	}

}
